package org.zhq.aspect;

import lombok.extern.slf4j.Slf4j;
import org.aspectj.lang.ProceedingJoinPoint;
import org.aspectj.lang.annotation.Around;
import org.aspectj.lang.annotation.Aspect;
import org.springframework.stereotype.Component;

@Aspect
@Component
@Slf4j
public class ServiceLogAspect {

    /**
     * 切面表达式
     * execution 代表所要执行的表达式主体
     * 第一处 代表方法返回类型 *代表所有类型
     * 第二处 包名代表aop监控的类所在的包
     * 第三处 ..代表该包以及其子包下的所有类方法
     * 第四处 * 代表类名, *代表所有类
     * 第五处 *(..) *代表类中的方法名,(..)
     * @param point
     * @return
     */

    @Around("execution(* org.zhq.service.impl..*.*(..))")
    public Object recordTimeLog(ProceedingJoinPoint point) throws Throwable {
        log.info("========== start execute {}.{} ==========",point.getTarget(),point.getSignature().getName());
        //0.记录开始时间
        long begin = System.currentTimeMillis();
        //1.执行service
        Object result = point.proceed();
        //2.记录开始时间
        long end = System.currentTimeMillis();

        long takeTime = end - begin;

        if(takeTime>3000){
            log.error("========== finish execute. cost {} ms ==========",takeTime);
        }else if(takeTime >2000){
            log.warn("========== finish execute. cost {} ms ==========",takeTime);
        }else{
            log.info("========== finish execute. cost {} ms ==========",takeTime);
        }
        return result;
    }
}
